package ceura.ia.practica.android.utilities;

import android.view.MotionEvent;
import ceura.ia.practica.Point;
import ceura.ia.practica.properties.Propiedades;

/**
 * Clase de utilidades para convertir tipos de datos.
 *
 * @author 66785403 (Jorge Madrid Portillo)
 */
public class LaberintoUtils {

    private Propiedades properties;

    /**
     *
     */
    public LaberintoUtils() {
        this.properties = Propiedades.getInstance();
    }

    /**
     * Éste método parsea un punto (x,y) en una posición dado un número de
     * columnas y filas.
     *
     * @param punto Punto a convertir.
     * @return La posición de dicho punto.
     */
    public int parsearTablaGrid(Point punto) {
        return (punto.y * properties.numCol) + punto.x;
    }

    /**
     * Método inverso al anterior, parsea de posición dado un número de columnas
     * a un punto (x,y).
     *
     * @param i posición.
     * @param columnas Número de columnas.
     * @param filas Número de filas
     * @return
     */
    public Point parsearTablatoPoint(int i, int columnas, int filas) {
        int y = i / columnas;
        int x = i % filas;
        return new Point(x, y);
    }

    /**
     * Permite traducir una coordenada real de android a una posición del
     * laberinto dado que una celda tiene X ancho.
     *
     * @param xOrigen Coordenada x de origen.
     * @return El valor de coordenadas del laberinto.
     */
    public int getXCelda(float xOrigen) {
        return Math.round(xOrigen) / properties.getWidthCelda();
    }

    /**
     * Permite traducir una coordenada real de android a una posición del
     * laberinto dado que una celda tiene X alto.
     *
     * @param yOrigen Coordenada y de origen.
     * @return El valor de coordenadas del laberinto.
     */
    public int getYCelda(float yOrigen) {
        return Math.round(yOrigen) / properties.getHeightCelda();
    }

    /**
     * Permite saber si una coordenada concreta, dado un evento de pulsado de
     * Android, está dentro del área del rectángulo del laberinto visible.
     *
     * @param event MotionEvent de Android.
     * @param margin El margen del rectángulo visible.
     * @return Si la coordenada está dentro del rectángulo o no.
     */
    public boolean checkIsInLaberintoBounds(MotionEvent event, int margin) {
        Point point = new Point(Math.round(event.getX()), Math.round(event.getY()));
        if (point.x <= properties.getWindowWidth() - margin
                && point.y <= properties.getWindowHeight() - margin
                && point.x >= 0 + margin && point.y >= 0 + margin) {
            return true;
        }
        return false;
    }
}
